/*
 * RegistroAbstracto.cpp
 *
 */
#include "RegistroAbstracto.h"
#include "RegistroInterno.h"
#include "RegistroDatosConteo.h"
#include "RegistroDatosCandidato.h"
#include "RegistroDatosCargo.h"
#include "RegistroDatosDistrito.h"
#include "RegistroDatosLista.h"


RegistroAbstracto::RegistroAbstracto(){
	this->_id = -1;
	this->_serializador.reset();
}


RegistroAbstracto::~RegistroAbstracto(){
	this->_id = -1;
	this->_serializador.reset();
}


void RegistroAbstracto::setId(unsigned long int id){
	this->_id = id;
}


unsigned long int RegistroAbstracto::getId(){
	return this->_id;
}


// Es un constructor virtual
RegistroAbstracto* RegistroAbstracto::unPack(char* dataBuffer, datosArchivados tipo, bool esHoja){
	// Como no puedo guarda un flag que me indique que tipo de registro hay que
	// crear dependo de la funcion llamante para que lo indique

	switch (tipo){
		// La estructura de conteo
		case CONTEO:
			if (esHoja) return new RegistroDatosConteo(dataBuffer);
			else return new RegistroInterno(dataBuffer);
			break;

		case CANDIDATO:
			if (esHoja) return new RegistroDatosCandidato(dataBuffer);
			else return new RegistroInterno(dataBuffer);
			break;

		case CARGO:
			if (esHoja) return new RegistroDatosCargo(dataBuffer);
			else return new RegistroInterno(dataBuffer);
			break;

		case DISTRITO:
			if (esHoja) return new RegistroDatosDistrito(dataBuffer);
			else return new RegistroInterno(dataBuffer);
			break;

		case LISTA:
			if (esHoja) return new RegistroDatosLista(dataBuffer);
			else return new RegistroInterno(dataBuffer);
			break;

		case NONE:
		default: break;
	}

	// El tipo señalado no existe
	return NULL;
}


